<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    function Fn() {
        // {}  
        // {}[[Prototype]] = Fn.prototype;
        // this->{}

        // return this;  // {}

        // 返回一个数组=> 数组不能使用构造函数Fn.prototype上的方法  
        // var list = [1, 2, 3]; // [1,2,3,[[Prototype]]:Array.prototype]
        var list = [...arguments];

        // 设置数组的原型属性[[Prototype]]指向Fn.prototype(只有真数组可以)
        Object.setPrototypeOf(list, Fn.prototype); //  [1,2,3,[[Prototype]]:Fn.prototype]
        return list;  // 结果 => 得到一个伪数组(有数组的结构 但是不能使用数组的方法) => 当构造函数想要返回数组结构的数据 -> 又想返回的伪数组可以使用构造函数的方法时,可以这么玩
    }

    Fn.prototype.say = function () {
        console.log("hello");
    }

    Fn.prototype.forEach = function (callback) { // 形参callback接收了一个函数
        // this -> 调用此方法的实例化对象
        // var callback = function (item, index, array) {  // 传入的函数
        //     console.log(item, index, array);
        // }

        // 每次循环执行传入的函数
        for (var i = 0; i < this.length; i++) {
            // this[i]
            // i
            // this
            callback(this[i], i, this);
        }

    }



    var res = new Fn(1, 4, 7, 2, 5, 8, 3, 6, 9);
    console.log(res);

    res.forEach(function (item, index, array) {
        console.log(item, index, array);
    })







</script>

</html>